class MyTransform {
  constructor() {
    this.packageHeaderLen = 4 // header 总长度
    this.serialNum = 0
    this.serialLen = 2
  }

  // 编码
  encode(data, serialNum) {
    const body = Buffer.from(data) // 把数据变成二进制的数据

    // 1-按照指定的长度申请一片内存空间作为 header 来使用
    const headerBuf = Buffer.alloc(this.packageHeaderLen)

    // 2-组装header
    headerBuf.writeInt16BE(serialNum || this.serialNum) // 序列号
    headerBuf.writeInt16BE(body.length, this.serialLen) // Body 长度

    if (serialNum === undefined) {
      this.serialNum++
    }

    return Buffer.concat([headerBuf, body])
  }

  // 解码
  decode(buffer) {
    const headerBuf = buffer.slice(0, this.packageHeaderLen)
    const bodyBuf = buffer.slice(this.packageHeaderLen)

    return {
      serialNum: headerBuf.readInt16BE(),
      bodyLength: headerBuf.readInt16BE(this.serialLen),
      body: bodyBuf.toString(),
    }
  }

  // 获取包长度的方法
  getPackageLen(buffer) {
    if (buffer.length < this.packageHeaderLen) {
      return 0
    } else {
      return this.packageHeaderLen + buffer.readInt16BE(this.serialLen)
    }
  }
}

module.exports = MyTransform
